package cn.sccl.common.scaffold;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Map;

/**
 * 文件生成器
 * Created by 杨浩宇 on 2016-02-20.
 */
public abstract class FileGenerator {

    /**
     * freemaker的模板文件
     *
     * @return 相对于模板文件根目录的文件位置。
     */
    public abstract String getTemplate();

    /**
     * 是否保存到java文件所在的目录
     *
     * @return
     */
    public abstract boolean storeToJavaSrc();

    /**
     * 填充freemaker的参数
     *
     * @param fileConfig
     * @return
     */
    public abstract Map fillParams(FileConfig fileConfig);

    /**
     * 生成的目标文件路径
     *
     * @param projectPath 项目路径
     * @param packagePath 基础包路径，以"/"表达路径层级
     * @param modelName   模型名称
     * @return 一般来说，根据文件类型决定返回值。
     * 如果是java文件，返回projectPath + "src/main/java" + packagePath + "文件所在包/" + "文件名";
     * 如果是资源文件，返回projectPath + "src/main/resources" + "文件所在路径/" + "文件名";
     */
    public abstract String getTargetPath(String projectPath, String packagePath, String modelName);

    /**
     * 根据freemaker的模板文件生成相应的文件
     *
     * @param configuration freemaker配置
     * @throws IOException
     * @throws TemplateException
     */
    public void generator(Configuration configuration, FileConfig fileConfig) throws IOException, TemplateException {
        //获取模板
        Template template = configuration.getTemplate(getTemplate());

        //构造模板需要的参数
        Map paramMap = fillParams(fileConfig);
        paramMap.put("author", System.getProperty("user.name"));//两个默认构造的参数
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        paramMap.put("createDate", sdf.format(Calendar.getInstance().getTime()));

        //freemaker生成文件
        template.process(paramMap, new FileWriter(fileConfig.getTargetFile()));
    }
}
